package com.bestvike.stone.spring.exception;

import com.bestvike.stone.core.collection.CollectionUtils;
import com.bestvike.stone.core.collection.MapUtils;
import com.bestvike.stone.core.lang.StringUtils;

import java.util.Collection;
import java.util.Map;

/**
 * Created by 许崇雷 on 2018-08-28.
 */
public final class AssertUtils {
    private AssertUtils() {
    }

    /**
     * 断言条件为 true
     *
     * @param expression 条件
     * @param message    不为 true 抛出的异常信息
     */
    public static void isTrue(boolean expression, String message) {
        if (!expression)
            throw new BusinessException(ErrorCode.ERROR_PARAM, message);
    }

    /**
     * 断言指定的对象不为 null
     *
     * @param object    指定的对象
     * @param paramName 抛出参数异常时的参数名,最终用户可见
     */
    public static void notNull(Object object, String paramName) {
        if (object == null)
            throw new ArgumentEmptyException(paramName);
    }

    /**
     * 断言指定的字符串不为 null 并且不为空
     *
     * @param text      指定的字符串
     * @param paramName 抛出参数异常时的参数名,最终用户可见
     */
    public static void hasLength(String text, String paramName) {
        if (StringUtils.isEmpty(text))
            throw new ArgumentEmptyException(paramName);
    }

    /**
     * 断言指定的字符串有可见字符
     *
     * @param text      指定的字符串
     * @param paramName 抛出参数异常时的参数名,最终用户可见
     */
    public static void hasText(String text, String paramName) {
        if (StringUtils.isBlank(text))
            throw new ArgumentEmptyException(paramName);
    }

    /**
     * 断言指定的集合不为空
     *
     * @param collection 指定的集合
     * @param paramName  抛出参数异常时的参数名,最终用户可见
     */
    public static void notEmpty(Collection<?> collection, String paramName) {
        if (CollectionUtils.isEmpty(collection))
            throw new ArgumentEmptyException(paramName);
    }

    /**
     * 断言指定的键值对集合不为空
     *
     * @param map       指定的键值对集合
     * @param paramName 抛出参数异常时的参数名,最终用户可见
     */
    public static void notEmpty(Map<?, ?> map, String paramName) {
        if (MapUtils.isEmpty(map))
            throw new ArgumentEmptyException(paramName);
    }
}
